home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_std / character.e < prev    next >
Text File  |  2000-03-25  |  9KB  |  365 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://SmallEiffel.loria.fr
  11. --
  12. expanded class CHARACTER
  13. --
  14. -- Note: An Eiffel CHARACTER is mapped as a C char or as a Java Byte.
  15. --
  16.  
  17. inherit 
  18.    CHARACTER_REF
  19.       redefine
  20.          infix "<", infix "<=", infix ">", infix ">=", code, to_lower, 
  21.          to_upper, out_in_tagged_out_memory, fill_tagged_out_memory,
  22.          hash_code
  23.       end;
  24.  
  25. feature 
  26.  
  27.    to_integer: INTEGER is
  28.          -- Sign-extended conversion.
  29.       external "SmallEiffel" 
  30.       ensure
  31.          Result.in_range(-2^(Character_bits-1),2^(Character_bits-1)-1)
  32.       end;
  33.  
  34.    code: INTEGER is
  35.          -- ASCII code of Current.
  36.          -- No Sign-extended conversion.
  37.       external "SmallEiffel" 
  38.       ensure
  39.          Result.in_range(Minimum_character_code,Maximum_character_code)
  40.       end;
  41.  
  42.    infix "<" (other: CHARACTER): BOOLEAN is
  43.          -- Comparison using `code'. 
  44.       do
  45.          Result := code < other.code;
  46.       end;
  47.    
  48.    infix "<=" (other: CHARACTER): BOOLEAN is
  49.          -- Comparison using `code'. 
  50.       do
  51.          Result := code <= other.code;
  52.       end;
  53.    
  54.    infix ">" (other: CHARACTER): BOOLEAN is
  55.          -- Comparison using `code'. 
  56.       do
  57.          Result := code > other.code;
  58.       end;
  59.    
  60.    infix ">=" (other: CHARACTER): BOOLEAN is
  61.          -- Comparison using `code'. 
  62.       do
  63.          Result := code >= other.code;
  64.       end;
  65.    
  66.    value, decimal_value: INTEGER is
  67.          -- Gives the value of a decimal digit.
  68.       require
  69.          is_digit
  70.       do
  71.          Result := code - 48;
  72.       ensure
  73.          Result.in_range(0,9)
  74.       end;
  75.  
  76.    binary_value: INTEGER is
  77.          -- Gives the value of a binary digit.
  78.       require
  79.          is_binary_digit
  80.       do
  81.          Result := code - 48;
  82.       ensure
  83.          Result.in_range(0,1)
  84.       end;
  85.  
  86.    octal_value: INTEGER is
  87.          -- Gives the value of an octal digit.
  88.       require
  89.          is_octal_digit
  90.       do
  91.          Result := code - 48;
  92.       ensure
  93.          Result.in_range(0,7)
  94.       end;
  95.  
  96.    hexadecimal_value: INTEGER is
  97.          -- Gives the value of an hexadecimal digit.
  98.       require
  99.          is_hexadecimal_digit
  100.       do
  101.          if code < ('A').code then
  102.             Result := code - 48;
  103.          elseif code < ('a').code then
  104.             Result := code - 55;
  105.          else
  106.             Result := code - 87;
  107.          end;
  108.       ensure
  109.          Result.in_range(0,15)
  110.       end;
  111.  
  112.    same_as(other: CHARACTER): BOOLEAN is
  113.          -- Case insensitive comparison.
  114.          -- No difference between upper/lower case letters.
  115.       do
  116.          if Current = other then
  117.             Result := true;
  118.          else
  119.             inspect
  120.                code
  121.             when 65 .. 90 then
  122.                Result := code = other.code - 32;
  123.             when 97 .. 122 then
  124.                Result := code = other.code + 32;
  125.             else
  126.             end;
  127.          end;
  128.       ensure
  129.          Result implies to_lower = other or to_upper = other;
  130.       end ;
  131.    
  132.    to_upper: CHARACTER is
  133.          -- Conversion to the corresponding upper case.
  134.       do
  135.          if code < 97 then
  136.             Result := Current;
  137.          elseif code > 122 then
  138.             Result := Current;
  139.          else
  140.             Result := (code - 32).to_character;
  141.          end;
  142.       end;
  143.    
  144.    to_lower: CHARACTER is
  145.          -- Conversion to the corresponding lower case.
  146.       do
  147.          if code < 65 then
  148.             Result := Current;
  149.          elseif code > 90 then
  150.             Result := Current;
  151.          else
  152.             Result := (code + 32).to_character;
  153.          end;
  154.       end;
  155.    
  156.    is_letter: BOOLEAN is
  157.          -- Is it a letter ?
  158.       do
  159.          if Current >= 'a' then
  160.             Result := Current <= 'z';
  161.          elseif Current >= 'A' then
  162.             Result := Current <= 'Z';
  163.          end;
  164.       ensure
  165.          Result = in_range('A','Z') or in_range('a','z')
  166.       end;
  167.    
  168.    is_digit, is_decimal_digit: BOOLEAN is
  169.          -- Belongs to '0'..'9'.
  170.       do
  171.          if Current >= '0' then
  172.             Result := Current <= '9';
  173.          end;
  174.       ensure
  175.         Result = in_range('0','9')
  176.       end;
  177.    
  178.    is_binary_digit: BOOLEAN is
  179.          -- Belongs to '0'..'1'.
  180.       do
  181.          if Current >= '0' then
  182.             Result := Current <= '1';
  183.          end;
  184.       ensure
  185.          Result = in_range('0','1')
  186.       end;
  187.    
  188.    is_octal_digit: BOOLEAN is
  189.          -- Belongs to '0'..'7'.
  190.       do
  191.          if Current >= '0' then
  192.             Result := Current <= '7';
  193.          end;
  194.       ensure
  195.          Result = in_range('0','7')
  196.       end;
  197.    
  198.    is_hexadecimal_digit: BOOLEAN is 
  199.          -- Is it one character of "0123456789abcdefABCDEF" ?
  200.       do  
  201.          if is_digit then
  202.             Result := true;
  203.          elseif Current >= 'a' then
  204.             Result := Current <= 'f';
  205.          elseif Current >= 'A' then
  206.             Result := Current <= 'F';
  207.          end;
  208.       ensure
  209.          Result =  ("0123456789abcdefABCDEF").has(Current)
  210.       end; 
  211.  
  212.    is_lower: BOOLEAN is 
  213.          -- Is `item' lowercase?
  214.       do  
  215.          inspect 
  216.             Current
  217.          when 'a'..'z' then 
  218.             Result := true;
  219.          else 
  220.          end; 
  221.       end; 
  222.    
  223.    is_upper: BOOLEAN is 
  224.          -- Is `item' uppercase?
  225.       do  
  226.          inspect 
  227.             Current
  228.          when 'A'..'Z' then 
  229.             Result := true;
  230.          else 
  231.          end; 
  232.       end; 
  233.    
  234.    is_separator: BOOLEAN is
  235.          -- True when character is a separator.
  236.       do
  237.          inspect
  238.             Current
  239.          when ' ','%T','%N','%R','%U' then
  240.             Result := true;
  241.          else
  242.          end;
  243.       end;
  244.    
  245.    is_letter_or_digit: BOOLEAN is 
  246.       -- Is character a letter or digit ?
  247.       do  
  248.          Result := is_letter or else is_digit;
  249.       ensure 
  250.          valid: Result = (is_letter or is_digit); 
  251.       end; 
  252.  
  253.    is_hex_digit: BOOLEAN is 
  254.       obsolete "This feature will be soon removed.%
  255.                %Since release -0.78, the new name for this feature %
  256.                %is `is_hexadecimal_digit'. Please, update your code."
  257.       do  
  258.          Result := is_hexadecimal_digit;
  259.       end; 
  260.  
  261.    is_ascii: BOOLEAN is 
  262.          -- Is character a 8-bit ASCII character?
  263.       do  
  264.          inspect 
  265.             Current
  266.          when '%U'..'%/255/' then 
  267.             Result := true;
  268.          else 
  269.          end; 
  270.       end; 
  271.  
  272.    is_bit: BOOLEAN is
  273.          -- True for `0' and `1'.
  274.       do
  275.          inspect
  276.             Current
  277.          when '0','1' then
  278.             Result := true;
  279.          else
  280.          end;
  281.       end;
  282.  
  283.    next: CHARACTER is
  284.          -- Give the next character (the following `code');
  285.       do
  286.          Result := (code + 1).to_character;
  287.       end;
  288.  
  289.    previous: CHARACTER is
  290.          -- Give the next character (the following `code');
  291.       require
  292.          code > 0
  293.       do
  294.          Result := (code - 1).to_character;
  295.       end;
  296.  
  297. feature -- Conversions :
  298.  
  299.    to_bit: BIT Character_bits is
  300.       external "SmallEiffel"
  301.       end;
  302.  
  303.    to_octal: INTEGER is
  304.       obsolete "This strange feature will be removed in release -0.77. %
  305.                %Please update your code."
  306.       do
  307.          Result := code.to_octal;
  308.       end;
  309.  
  310.    to_hexadecimal: STRING is
  311.          -- Create a new STRING giving the `code' in hexadecimal.
  312.          -- For example :
  313.          --    (255).to_character.to_hexadecimal gives "FF".
  314.          -- Note: see `to_hexadecimal_in' to save memory.
  315.       do
  316.          !!Result.make(2);
  317.          to_hexadecimal_in(Result);
  318.       ensure
  319.          Result.count = 2
  320.       end;
  321.  
  322.    to_hexadecimal_in(str: STRING) is
  323.          -- Append the equivalent of `to_hexadecimal' at the end of 
  324.          -- `str'. Thus you can save memory because no other
  325.          -- STRING is allocate for the job.
  326.       local
  327.          c: CHARACTER;
  328.       do
  329.          c := ((to_bit and 11110000B) @>> 4).to_character;
  330.          inspect
  331.             c.code
  332.          when 0 .. 9 then
  333.             str.extend((('0').code + c.code).to_character);
  334.          else
  335.             str.extend(((('A').code - 10) + c.code).to_character);
  336.          end;
  337.          c := (to_bit and 00001111B).to_character;
  338.          inspect
  339.             c.code
  340.          when 0 .. 9 then
  341.             str.extend((('0').code + c.code).to_character);
  342.          else
  343.             str.extend(((('A').code - 10) + c.code).to_character);
  344.          end;
  345.       ensure
  346.          str.count = 2 + old str.count
  347.       end;
  348.  
  349. feature -- Object Printing :
  350.  
  351.    out_in_tagged_out_memory, fill_tagged_out_memory is
  352.       do
  353.          tagged_out_memory.extend(Current);
  354.       end;
  355.    
  356. feature -- Hashing :
  357.    
  358.    hash_code: INTEGER is
  359.       do
  360.          Result := code;
  361.       end;
  362.  
  363. end -- CHARACTER
  364.  
  365.